package learnjava.jvm;

class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("(1)");
    }

    Father () {
        System.out.println("(2)");
    }

    {
        System.out.println("(3)");
    }

    public int test () {
        System.out.println("(4)");
        return 1;
    }

    public static int method () {
        System.out.println("(5)");
        return 1;
    }
}

public class Son extends Father {


    private static int j = method();

    final int a = 1;

    static {
        System.out.println("(6)");
    }

    Son() {
        i = 2;
        System.out.println("(7)");
    }
    private int i = 1;
//    private int i = test();
    { //会被放到构造函数语句前
        System.out.println("(8)");
    }

    public int test() {
        System.out.println("(9)");
        return 1;
    }

    public static int method() {
        System.out.println("(10)");
        return 1;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
//        (5) (1) 父类类初始化
//        (10) (6) 子类类初始化
//        (9)  父类成员变量但是由于调用了test，调用此方法的this还是子类
//        (3) (2) 父类构造函数
//        (9)  子类成员变量
//        (8) (7) 子类构造函数
        System.out.println(s1.i);
        Son s2 = new Son();
//        (9)  子类成员变量
//        (3) (2) 父类构造函数
//        (9)  子类成员变量
//        (8) (7) 子类构造函数
    }


    /**
     * 括号括起来的都认为是方法，没括起来的都是成员
     * 带static的都是在类初始化执行，按上下顺序执行
     * 不带static的在实例化时执行，构造函数外的先执行
     */
}
